using PhraseCorrector.Common;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;

namespace PhraseCorrector.DirectTanslate
{

    /**
     * 翻译类，用于将给定的文本翻译为
     * 中文或英文。
     * 其它字典将据此生成词库。
     */

    public class English_Chinese_Dictionary: IDisposable
    {
        #region 字典
        // ///////////////////////////////////////////////////////////////////////////       
        /// <summary>
        /// 术语字典，用于存储英文和中文之间的对应关系。
        /// </summary>
        public  Dictionary<string, string> English_Chinese_library { set; get; } = new Dictionary<string, string>();

        #endregion

        #region 初始化
        // ///////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 初始化ChinesePhraselibrary类的实例。
        /// </summary>
        public English_Chinese_Dictionary()
        {
            if (English_Chinese_library.Count == 0 && libraryIsExis)
            {
                LoadFromFile();
                LoadBaselibrary();
            }
        }

        // ///////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 获取表示是否存在的库文件的布尔值属性。
        /// </summary>
        /// <value>如果库文件存在则返回true，否则返回false。</value>
        public  bool libraryIsExis
        {
            get
            {
                FileInfo fileInfo = new FileInfo(BasePath.EnglishChineseLibPath);
                return fileInfo.Exists;
            }
        }

        // ///////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 逐行加载文件内容，并处理每一行。
        /// </summary>
        /// <param name="fInfo">要加载的文件信息。</param>
        private void LoadFromFile()
        {
            // 使用StreamReader读取文件内容
            using StreamReader sr1 = new StreamReader(BasePath.EnglishChineseLibPath);
            // 循环读取文件的每一行，直到文件结束
            while (sr1.Peek() != -1)
                ReadAndInsert(sr1.ReadLine());
        }

        // ///////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 读取一行文件内容，并尝试插入到术语字典中。
        /// </summary>
        /// <param name="line">一行文件内容。</param>
        private void ReadAndInsert(string line)
        {
            if (!string.IsNullOrEmpty(line))
                TryAdd(DicsUtilities.FormatECDicsLine(line.Split(' ')));
        }

        // ///////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 尝试将解析后的键值对添加到术语字典中。
        /// </summary>
        /// <param name="keyValue">解析后的键值对数组。</param>
        private void TryAdd(string[] keyValue) {
            // 如果解析出了键和值，则尝试添加到术语字典中
            if (keyValue.Length == 2 && Utilities.IsChineseBegin(keyValue[1]) && Utilities.IsLetterBegin(keyValue[0]))
                English_Chinese_library.TryAdd(keyValue[0].ToLower(), keyValue[1]);
        }

        // ///////////////////////////////////////////////////////////////////////////
        /// 加载基础词库
        /// 
        /// 本方法旨在实例化两种语言转换类，为系统的国际化功能提供支持
        /// 通过创建英语到中文及中文到英语的转换器对象，确保系统能够
        /// 在两种语言之间进行必要的翻译操作
        ///
        /// 参数: 无
        /// 返回值: 无
        public void LoadBaselibrary()
        {
            // 实例化英语到中文的转换器
            new EnglishTraslator(this);

            // 实例化中文到英语的转换器
            new ChineseTraslator(this);
        }
        #endregion

        #region 翻译

        // ///////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 翻译给定的短语数组。
        /// </summary>
        /// <param name="phrase">待翻译的短语数组。</param>
        /// <returns>翻译后的字符串。</returns>
        public static string Translate(string[] phrase) {
            // 初始化结果字符串
            string result = "";
            // 遍历短语数组中的每个元素
            foreach (var item in phrase) {
                // 对每个短语进行过滤和翻译，然后添加到结果字符串中
                result += Translateor(Utilities.ReplaceBdfh(item, "")) + " ";
            }
            // 返回翻译后的结果字符串
            return result;
        }

        // ///////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 翻译给定的英文或中文关键字。
        /// </summary>
        /// <param name="key">要翻译的关键字。</param>
        /// <returns>翻译后的结果。如果无法翻译，则返回原始关键字。</returns>
        public static string Translateor(string key) {
            // 检查关键字是否为单个字母
            return (Utilities.IsLetterBegin(key))
                ? EC_Translate(key)
                : CE_Translate(key);
        }

        // ///////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 将给定的关键字从中文翻译为英文。
        /// </summary>
        /// <param name="key">要翻译的关键字。</param>
        /// <returns>翻译后的英文字符串，如果找不到翻译则返回原始关键字。</returns>
        private static string CE_Translate(string key) {
            // 获取给定关键字的所有翻译
            var ret = ChineseTraslator.Get(key);
            return ret.Words;
        }

        // ///////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 将给定的关键字从英文翻译为中文。
        /// </summary>
        /// <param name="key">要翻译的关键字。</param>
        /// <returns>翻译后的中文字符串，如果找不到翻译则返回原始关键字。</returns>
        private static string EC_Translate(string key) {
            var ret = EnglishTraslator.TreeSearch(key);
            return ret[0].Chinese;
        }

        #endregion
        public void Dispose()
        {
            English_Chinese_library = null;
            GC.SuppressFinalize(true);
        }
    }
}
